From 4a4c15b2ac3b30635b2e0e2f3aa17546d8121958 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 15 Dec 2019 23:48:34 -0500 Subject: [PATCH] gtk-demo: Add filtering to the settings demo A demo of filtering with lists was missing so far. --- demos/gtk-demo/listview_settings.c | 59 +++++++++++++++++++++++++-- demos/gtk-demo/listview_settings.ui | 63 +++++++++++++++++++++-------- 2 files changed, 101 insertions(+), 21 deletions(-) diff --git a/demos/gtk-demo/listview_settings.c b/demos/gtk-demo/listview_settings.c index 254313923b..944b764dd6 100644 --- a/demos/gtk-demo/listview_settings.c +++ b/demos/gtk-demo/listview_settings.c @@ -3,8 +3,8 @@ * This demo shows a settings viewer for GSettings. * * It demonstrates how to implement support for trees with GtkListView. - * - * It also shows how to set up sorting for columns in a GtkColumnView. + * It also shows how to set up sorting and filtering for columns in a + * GtkColumnView. */ #include @@ -129,6 +129,8 @@ strvcmp (gconstpointer p1, return strcmp (*s1, *s2); } +static GtkFilter *current_filter; + static gboolean transform_settings_to_keys (GBinding *binding, const GValue *from_value, @@ -140,6 +142,9 @@ transform_settings_to_keys (GBinding *binding, GSettingsSchema *schema; GListStore *store; GtkSortListModel *sort_model; + GtkFilterListModel *filter_model; + GtkFilter *filter; + GtkExpression *expression; char **keys; guint i; @@ -170,7 +175,18 @@ transform_settings_to_keys (GBinding *binding, gtk_column_view_get_sorter (GTK_COLUMN_VIEW (data))); g_object_unref (store); - g_value_take_object (to_value, sort_model); + expression = gtk_property_expression_new (SETTINGS_TYPE_KEY, NULL, "name"); + filter = gtk_string_filter_new (); + gtk_string_filter_set_expression (GTK_STRING_FILTER (filter), expression); + filter_model = gtk_filter_list_model_new (G_LIST_MODEL (sort_model), filter); + gtk_expression_unref (expression); + g_object_unref (sort_model); + + g_set_object (¤t_filter, filter); + + g_object_unref (filter); + + g_value_take_object (to_value, filter_model); return TRUE; } @@ -223,6 +239,32 @@ create_settings_model (gpointer item, return G_LIST_MODEL (result); } +static void +search_enabled (GtkSearchEntry *entry) +{ + gtk_editable_set_text (GTK_EDITABLE (entry), ""); +} + +static void +search_changed (GtkSearchEntry *entry, + gpointer data) +{ + const char *text = gtk_editable_get_text (GTK_EDITABLE (entry)); + + if (current_filter) + gtk_string_filter_set_search (GTK_STRING_FILTER (current_filter), text); +} + +static void +stop_search (GtkSearchEntry *entry, + gpointer data) +{ + gtk_editable_set_text (GTK_EDITABLE (entry), ""); + + if (current_filter) + gtk_string_filter_set_search (GTK_STRING_FILTER (current_filter), ""); +} + static GtkWidget *window = NULL; GtkWidget * @@ -234,13 +276,22 @@ do_listview_settings (GtkWidget *do_widget) GListModel *model; GtkTreeListModel *treemodel; GtkSingleSelection *selection; + GtkBuilderScope *scope; GtkBuilder *builder; GtkColumnViewColumn *name_column; GtkSorter *sorter; g_type_ensure (SETTINGS_TYPE_KEY); - builder = gtk_builder_new_from_resource ("/listview_settings/listview_settings.ui"); + scope = gtk_builder_cscope_new (); + gtk_builder_cscope_add_callback_symbol (GTK_BUILDER_CSCOPE (scope), "search_enabled", (GCallback)search_enabled); + gtk_builder_cscope_add_callback_symbol (GTK_BUILDER_CSCOPE (scope), "search_changed", (GCallback)search_changed); + gtk_builder_cscope_add_callback_symbol (GTK_BUILDER_CSCOPE (scope), "stop_search", (GCallback)stop_search); + + builder = gtk_builder_new (); + gtk_builder_set_scope (builder, scope); + gtk_builder_add_from_resource (builder, "/listview_settings/listview_settings.ui", NULL); + window = GTK_WIDGET (gtk_builder_get_object (builder, "window")); gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget)); diff --git a/demos/gtk-demo/listview_settings.ui b/demos/gtk-demo/listview_settings.ui index 2bc197f68f..8bf12cf496 100644 --- a/demos/gtk-demo/listview_settings.ui +++ b/demos/gtk-demo/listview_settings.ui @@ -4,6 +4,16 @@ Settings 640 480 + + + 1 + + + system-search-symbolic + + + + 300 @@ -44,15 +54,32 @@ - + + vertical + + + + + + + + + + + + - + + 1 + 1 - - Name - - - + + + Name + + + ]]> + + - - - - - - Value - - - + + + Value + + + ]]> + + - + -- 2.30.2